import { login, getInfo, getBaseInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
// import router, { resetRouter } from '@/router'
import router, { resetRouter } from '@/router'

const getDefaultState = () => {
  return {
    token: getToken() || null, // 这个意思就是如果最开始没有token就将token设置为空，如果已经登录过了有了token就获取token
    userInfo: '',
    name: '',
    avatar: ''
  }
}

const state = getDefaultState()

const mutations = {
  setToken(state, token) {
    console.log(token)
    state.token = token
  },
  // 更新用户信息
  updateUserInfo(state, payload) {
    state.userInfo = payload
  }
}

const actions = {
  // 登录功能:调用接口，返回结果token,存储在Vuex中
  async login(context, payload) {
    // context相当于this.this.$store
    try {
      const { code, data } = await login(payload)

      // payload表示触发action传递的参数
      // 调用接口实现登录
      // console.log(ret)
      if (code === 10000) {
        // 获取后端返回的成果的信息，关键的是token
        context.commit('setToken', data)
        // return的值是要给组件使用
        // 缓存Token到Cookies
        setToken(data)
        return true
        // 上面的原始代码是
        // return new Promise((resolve) => {
        //   resolve(true)
        // })
      } else {
        // 登录失败
        return false
      }
    } catch {
      // 登录失败
      return false
    }
  },

  // 获取用户信息
  async getInfo(context) {
    const { code, data } = await getInfo()
    // 获取用户信息(包括用户名)
    // 获取用户头像等信息(上一个请求的返回结果,作为下一个请求的参数)
    const { code: acode, data: adata } = await getBaseInfo(data.userId)
    console.log(data)
    // 判断请求是否成功
    if (code === 10000 && acode === 10000) {
      // 这就是把结果解构了重新放到一个对象里面
      context.commit('updateUserInfo', {
        ...data,
        ...adata
      })
      return data
    } else {
      return null
    }
  },

  // 点击退出
  logout(context) {
    //  点击退出后
    // 1.清除token
    context.commit('setToken', null)
    // 2.清除用户信息
    context.commit('updateUserInfo', null)
    // 3.清除缓存里面的Token
    removeToken()
    // 重置路由
    resetRouter()
    // 销毁动态路由的带单，在局部模块中访问其他模块的mutation或者action,需要添加root选项
    context.commit('permission/updateRouter', [], { root: true })
    // 4.跳转到登录页
    router.push('/login')
  },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

